package com.newstore.view;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.Vector;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.Toast;

import com.google.zxing.integration.android.IntentIntegrator;
import com.google.zxing.integration.android.IntentResult;
import com.newstore.R;
import com.newstore.classes.Barcode;
import com.newstore.classes.NumberProduct;
import com.newstore.classes.Order;
import com.newstore.classes.Product;
import com.newstore.database.AccessDatabase;
import com.newstore.database.OrderDatabase;
import com.newstore.database.ProductDatabase;

/**
 * ListProduct est l'activité qui se lance après la sélection d'une commande
 * dans l'activité ListOrder Elle affiche la liste des produits correspondant à la
 * commande sélectionnée
 * 
 * @author gprudhom
 * @version 1.0
 */
public class ListProduct extends Activity
{

	private ListView maListViewPerso;
	private HashMap<NumberProduct, Boolean> contentOrder;
	HashMap<String, String> map;
	HashMap<String, String> hmap; // hashmap de l'élément cliqué
	SimpleAdapter mSchedule;
	Order order;
	/**
	 * Called when the activity is first created. Instancie les contrôles de
	 * l'activité
	 * */
	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.listview);
		contentOrder = new HashMap<NumberProduct, Boolean>();
		final TextView tvOrder = (TextView) findViewById(R.id.tvorder);

		// titre de la fenetre = ref de la commande
		int id = getIntent().getIntExtra("id", 0);

		SQLiteDatabase myDb = Authentication.accessDB.open(true);
		OrderDatabase usDb = new OrderDatabase(myDb);
		order = usDb.getOrderFromId(id);
		Authentication.accessDB.close();

		tvOrder.setText(order.getReference());
		maListViewPerso = (ListView) findViewById(R.id.listview);
		final ArrayList<HashMap<String, String>> listItem = new ArrayList<HashMap<String, String>>();

		Vector<HashMap<Product, Integer>> productsList = order.getContentOrder();

		for (int i = 0; i < productsList.size(); i++)
		{
			HashMap<Product, Integer> HMproduct = productsList.get(i);

			map = new HashMap<String, String>();

			for (Product mapKey : HMproduct.keySet())
			{
				Integer nbrProduct = HMproduct.get(mapKey);
				NumberProduct numberProduct = new NumberProduct(mapKey, nbrProduct);
				contentOrder.put(numberProduct, false);
				map.put("nom", mapKey.getName());
				
				if (nbrProduct == 1 || nbrProduct == 0)
					map.put("nombre", nbrProduct.toString() + " produit");
				else
					map.put("nombre", nbrProduct.toString() + " produits");
				
				map.put("img", String.valueOf(R.drawable.redcross24));
				listItem.add(map);
			}
		}

		mSchedule = new SimpleAdapter(this.getBaseContext(), listItem,
				R.layout.affichageitem, new String[]
				{ "img", "nom", "nombre" }, new int[]
				{ R.id.img, R.id.nomItem, R.id.infoItem });

		maListViewPerso.setAdapter(mSchedule);

		maListViewPerso.setOnItemClickListener(new OnItemClickListener()
		{
			@SuppressWarnings("unchecked")
			public void onItemClick(AdapterView<?> a, View v, int position,long id)
			{
				hmap = (HashMap<String, String>) maListViewPerso
						.getItemAtPosition(position);
				readEANCode();
			}
		});
	}

	/**
	 * Méthode qui est appelé lors de la lecture du code-barres. Elle permet de
	 * vérifier que le code-barres scanné correspond bien à un des produits.
	 */
	public void onActivityResult(int requestCode, int resultCode, Intent intent)
	{
		IntentResult scanResult = IntentIntegrator.parseActivityResult(
				requestCode, resultCode, intent);
		if (scanResult != null)
		{
			String nameProduct = hmap.get("nom");
			boolean successScan = false;

			for (NumberProduct mapKey : this.contentOrder.keySet())
			{
				Boolean dejaScanne = this.contentOrder.get(mapKey);
				
				if (!dejaScanne
						&& scanResult.getContents().equals(mapKey.getProduct().getBarcode().toString())
						&& mapKey.getProduct().getName() == nameProduct)
				{
					int newStock = mapKey.getProduct().getStock() - mapKey.getNumberProduct();
					if(newStock < 0){
						this.alertDialogForScan("Stock insuffisant",
								"Le stock du produit est inférieure à la quantité demandée.", false);
						successScan = true;
						break;
					}
					this.contentOrder.put(mapKey, true);
					successScan = true;
					Toast.makeText(getApplicationContext(),
							"Produit scanné avec succès", Toast.LENGTH_SHORT)
							.show();
					
					SQLiteDatabase database = Authentication.accessDB.open(true);
					ProductDatabase productDatabase = new ProductDatabase(database);
					productDatabase.updateStockProductFromId(mapKey.getProduct().getId(), newStock);
					Authentication.accessDB.close();
					hmap.put("img", String.valueOf(R.drawable.valide22));
					maListViewPerso.setAdapter(mSchedule);
					break;
				}
			}
			if (!successScan)
				this.alertDialogForScan("Scan échoué",
						"Le produit que vous avez scanné ne correspond pas au produit sélectionné.", true);
		}
		if(!contentOrder.values().contains(false))
		{
			Intent intentBC = new Intent(this, DisplayBarcode.class);
			intentBC.putExtra("id", order.getId());
			startActivity(intentBC);	
		}
		
	}

	/**
	 * Alert Dialog qui permet de lancer le lecteur de code-barres
	 * 
	 * @param title
	 *            Titre de la fenêtre
	 * @param message
	 *            Message dans la fenêtre
	 */
	public void alertDialogForScan(String title, String message, boolean stockOk)
	{
		AlertDialog.Builder alertDialog = new AlertDialog.Builder(
				ListProduct.this);
		alertDialog.setTitle(title);
		alertDialog.setMessage(message);
		
		if(stockOk){ // si la produit n'est pas le bon
		alertDialog.setPositiveButton("Ok",
				new DialogInterface.OnClickListener()
				{
					public void onClick(DialogInterface dialog, int which)
					{
							readEANCode();
					}
				});
		}
		else // si la produit est le bon mais qu'il n'est plus en stock
		{
			alertDialog.setPositiveButton("Ok", null);
		}
		alertDialog.show();
	}

	/**
	 * Permet de lancer le lecteur de code-barres
	 */
	public void readEANCode()
	{
		IntentIntegrator integrator = new IntentIntegrator(this);
		integrator.initiateScan();
	}
}
